//
//  ListeningModelController.m
//  Objc进阶Demo
//
//  Created by Don't update on 2018/7/16.
//  Copyright © 2018年 Don't update. All rights reserved.
//


/*
 
 在iOS开发中，苹果提供了许多机制给我们进行回调。KVO(key-value-observing)是一种十分有趣的回调机制，在某个对象注册监听者后，在被监听的对象发生改变时，对象会发送一个通知给监听者，以便监听者执行回调操作。最常见的KVO运用是监听scrollView的contentOffset属性，来完成用户滚动时动态改变某些控件的属性实现效果，包括渐变导航栏、下拉刷新控件等效果。
 
 KVO的使用非常简单，使用KVO的要求是对象必须能支持kvc机制——所有NSObject的子类都支持这个机制
 */

#import "ListeningModelController.h"
@interface ListeningModelController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic,strong)UITableView *tableView;
@property(nonatomic,strong)NSArray *list;

@property(nonatomic,assign)NSInteger testNum;



@end

@implementation ListeningModelController



-(NSArray *)list{
    if (_list == nil) {
        _list = [[NSArray alloc]init];
        NSMutableArray *arr = [[NSMutableArray alloc]init];
        for (int i = 0; i<30; i++) {
            [arr addObject:[NSString stringWithFormat:@"%d",i]];
        }
        _list = arr;
    }
    return _list;
}

-(UITableView *)tableView{
    if(_tableView ==nil){
        _tableView = [[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
        _tableView.delegate = self;
        _tableView.dataSource = self;
        [self.view addSubview:_tableView];
      
    }
    return _tableView;
}

#pragma mark  --- tableView 代理
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _list.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifity = @"ListeningModel_ID";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifity];
    if (cell  == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifity];
    }
    cell.textLabel.text = _list[indexPath.row];
    return cell;
}


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    _testNum++;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.title = @"监听模式";
    [self list];
    [self tableView];
    self.testNum = 10;
    //添加监听     者   监听属性值发生改变
//    [self.tableView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
    [self addObserver:self forKeyPath:@"testNum" options:NSKeyValueObservingOptionNew context:nil];
    self.testNum = 100;
}

//监听属性值发生改变时回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
//    CGFloat offset = self.tableView.contentOffset.y;
//    CGFloat delta = offset /64.f +1.f ;
//    delta = MAX(0, delta);
    NSLog(@"值改变 %lu",_testNum);
//    self.navigationController.navigationBar.alpha =0;
}


//此处方法在退出该界面时调用 设置对应的通知要移除
-(void)dealloc{
    NSLog(@"移除");
    [self.tableView removeObserver:self forKeyPath:@"contentOffset"];
}

@end
